#include "ota_http_curl.h"


/**
 * @brief 回调方法
 */
static size_t write_callback(char *data, size_t size, size_t nmemb, void *userdata)
{
    response_body_t *response = (response_body_t *)userdata; //强转
    response->response_len = size* nmemb;// 块大小* 块数量=总大小

    response->response_str = (char *)malloc(response->response_len+1); //开空间
    memcpy(response->response_str, data, response->response_len);//拷贝
    response->response_str[response->response_len] = '\0';//加结束符
    return response->response_len;
   
}


/**
 * @brief 访问远端地址 获得文本内容
 */
response_body_t *ota_http_curl_get(char *url)
{
    //1 创建一个curl结构体
    CURL *curl = curl_easy_init();

    //2 如果结构体存在  
      // 填写相关参数 ： 1 url 2 回调 3 容器 
    if(curl==NULL)
    {
        log_error("curl_easy_init error");
        return NULL;
    }

    //3 执行  
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    //创建好空间的容器
    response_body_t *response_body = malloc(sizeof(response_body_t));
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_body);

    CURLcode res= curl_easy_perform(curl); //执行访问
    if(res != CURLE_OK)
    {
        perror("curl_easy_setopt error");
        curl_easy_cleanup(curl);
        return NULL;
    }

    //4 清理 
    curl_easy_cleanup(curl);
    //5  返回结果
    return response_body;


}

/**
 * @brief 访问远端地址 下载文件到指定的位置
 */
int ota_http_curl_download(char *url, char *file_path)
{

    //1 创建一个curl结构体
    CURL *curl = curl_easy_init();

    //2 如果结构体存在  
      // 填写相关参数 ： 1 url 2 回调 3 容器 
    if(curl==NULL)
    {
        log_error("curl_easy_init error");
        return -1;
    }

    //3 执行  
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite  );
    //创建好空间的容器
    FILE *fp = fopen(file_path, "wb");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp );

    CURLcode res= curl_easy_perform(curl); //执行访问
    if(res != CURLE_OK)
    {
        perror("curl_easy_setopt error");
        fclose(fp);
        curl_easy_cleanup(curl);
        return -1;
    }

    //4 清理 
    curl_easy_cleanup(curl);
    fclose(fp); //一定要close  会触发flush缓冲区 保证文件完整
    //5  返回结果
    return 0;



}